/*
 * Copyright (C) 2018 Logos Technology Ltd.
 */

package com.logos.tool;

import android.annotation.SuppressLint;
import android.text.TextUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumberFormatUtil {

    /**
     * 将double类型数据转换为百分比格式，并保留小数点前IntegerDigits位和小数点后FractionDigits位
     *
     * @param num            待转换浮点数
     * @param integerDigits  小数点前保留几位
     * @param fractionDigits 小数点后保留几位
     * @return 百分比.
     */
    public static String getPercentFormat(double num, int integerDigits, int fractionDigits) {
        NumberFormat nf = NumberFormat.getPercentInstance();
        nf.setMaximumIntegerDigits(integerDigits);//小数点前保留几位
        nf.setMinimumFractionDigits(fractionDigits);// 小数点后保留几位
        return nf.format(num);
    }

    /**
     * 将double类型数据转换为字符串，保留指定位数的小数。
     * 如果keepFractionTailZeros为false，则删除小数尾部的0.
     *
     * @param num                   num
     * @param fractionDigits        dia
     * @param keepFractionTailZeros 0
     * @return string
     */
    public static String doubleToFixedFractionDigitsString(double num,
                                                           int fractionDigits,
                                                           boolean keepFractionTailZeros) {
        String str = String.format(Locale.CHINA, ("%." + fractionDigits + "f"), num);
        String result = str;
        int dotIndex = str.indexOf('.');
        if (dotIndex >= 0 && !keepFractionTailZeros) {
            for (int i = str.length() - 1; i >= dotIndex; i--) {
                if ('.' == str.charAt(i)) {
                    result = str.substring(0, i);
                    break;
                } else if (str.charAt(i) != '0') {
                    result = str.substring(0, i + 1);
                    break;
                }
            }
        }
        return result;
    }

    /**
     * 有效国内电话判断.
     *
     * @param phone tel
     * @return bool
     */
    public static boolean isValidPhone(String phone) {
        if (null == phone || "".equals(phone)) {
            return false;
        }
        int length = phone.length();
        Pattern ptn = Pattern.compile(
                "^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(18[0-9])|(17[0-9]))\\d{8}$");
        Matcher matcher = ptn.matcher(phone);
        return (11 == length && matcher.matches());
    }

    /**
     * 将double类型的数据进转化，如果以.0结束则去掉
     * 例如6.0返回6，6.01返回6.01
     *
     * @param number number
     * @return string
     */
    public static String doubleRemoveEndZero(double number) {
        DecimalFormat decimalFormat = new DecimalFormat("###################.###########");
        return decimalFormat.format(number);
    }

    /**
     * 将String类型的数据进转化，如果以.0结束则去掉
     * 例如6.0返回6，6.01返回6.01
     *
     * @param number number
     * @return string
     */
    public static String doubleRemoveEndZero(String number) {
        String str = pointTwo(number);
        return doubleRemoveEndZero(Double.parseDouble(str));
    }

    /**
     * 保留两位小数
     *
     * @param number number
     * @return number
     */
    public static String pointTwo(double number) {
        DecimalFormat df = new DecimalFormat("######.00");
        String string = df.format(number);
        if (".".equals(string.substring(0, 1))) {
            return "0" + string;
        }
        return string;
    }

    /**
     * 保留两位小数
     *
     * @param number number
     * @return number
     */
    public static String pointTwo(String number) {
        if (TextUtils.isEmpty(number)) {
            return "0.00";
        }
        @SuppressLint("UseValueOf")
        double value = (new Double(number)).doubleValue();
        DecimalFormat df = new DecimalFormat("######.00");
        String string = df.format(value);
        if (".".equals(string.substring(0, 1))) {
            return "0" + df.format(value);
        }
        return df.format(value);
    }

    /**
     * 保留两位小数
     *
     * @param number number
     * @return 小数
     */
    public static String retainTwoDecimal(Object number) {
        DecimalFormat decimalFormat = new DecimalFormat("#.00");
        String format = decimalFormat.format(number);
        BigDecimal bigDecimal = new BigDecimal(format);
        return bigDecimal.toEngineeringString();
    }

    /**
     * 科学计数法
     *
     * @param number number
     * @return string
     */
    public static String countMethod(double number) {
        if (number < 10000) {
            return doubleRemoveEndZero(Double.parseDouble(pointTwo(number)));
        } else if (number < 100000000) {
            return doubleRemoveEndZero(Double.parseDouble(pointTwo(number / 10000))) + "万";
        } else {
            return doubleRemoveEndZero(Double
                    .parseDouble(pointTwo(number / 100000000))) + "亿";
        }
    }
}
